package br.ufrn.cerescaico.sepe.bo;

import br.ufrn.cerescaico.sepe.Sepe;
import br.ufrn.cerescaico.sepe.beans.Atividade;
import br.ufrn.cerescaico.sepe.beans.Email;
import br.ufrn.cerescaico.sepe.beans.Participante;
import br.ufrn.cerescaico.sepe.dao.AtividadeDao;
import br.ufrn.cerescaico.sepe.dao.Dao;
import br.ufrn.cerescaico.sepe.dao.util.DataAccessLayerException;
import br.ufrn.cerescaico.sepe.dao.util.PagerBean;
import br.ufrn.cerescaico.sepe.email.MailManager;
import br.ufrn.cerescaico.sepe.email.MailMessage;
import br.ufrn.cerescaico.sepe.util.Constantes;
import java.util.Date;
import java.util.List;
import org.apache.log4j.Logger;

/**
 * Classe de negócio do bean {@link Atividade} do sistema Sepe.
 * @author Taciano Morais Silva
 * @version 16/08/2010, 21h23m
 * @since 16/08/2010, 21h23m
 */
public class AtividadeBO extends AbstractBO {

    /**
     * Logger.
     */
    private Logger logger = Logger.getLogger(AtividadeBO.class);

    /**
     *
     * @param Sepe
     */
    public AtividadeBO(Sepe Sepe) {
        super(Sepe);
    }

    /**
     * Busca a atividade a partir do seu identificador.
     * @param id O identificador da atividade.
     * @return A atividade localizado ou <code>null</code>.
     */
    public Atividade buscar(Integer id) throws SepeException {
        try {
            Dao<Atividade> dao = new AtividadeDao(getSepe());
            return dao.find(id);
        } catch (DataAccessLayerException ex) {
            logger.error(ex.getMessage(), ex);
            throw new SepeException("erro.atividade.bo.buscar", ex);
        }
    }

    /**
     * Pesquisa de atividades sem filtros com paginação.
     * @param pager Os dados da paginação.
     * @return A lista paginada de atividades.
     * @throws SepeException Caso ocorra erro de acesso aos dados.
     */
    public List<Atividade> listar(PagerBean pager) throws SepeException {
        try {
            AtividadeDao dao = new AtividadeDao();
            return dao.listar(pager);
        } catch (DataAccessLayerException ex) {
            logger.error(ex.getMessage(), ex);
            throw new SepeException("erro.atividade.bo.listar", ex);
        }
    }

    public List<Atividade> listar(String horario) throws SepeException {
        try {
            AtividadeDao dao = new AtividadeDao();
            return dao.pesquisar(horario);
        } catch (DataAccessLayerException ex) {
            logger.error(ex.getMessage(), ex);
            throw new SepeException("erro.atividade.bo.listar", ex);
        }
    }

    public List<Atividade> listar(Participante participante) throws SepeException {
        verificarNull(participante);
        checkNullZero(participante.getId());
        try {
            AtividadeDao dao = new AtividadeDao();
            return dao.pesquisar(participante);
        } catch (DataAccessLayerException ex) {
            logger.error(ex.getMessage(), ex);
            throw new SepeException("erro.atividade.bo.listar", ex);
        }
    }

    /**
     * Incluir uma proposição de atividade no sistema.
     * @param atividade A atividade a ser incluído.
     */
    public void alterar(Atividade atividade) throws SepeException {
        verificarNull(atividade);
        try {
            Dao<Atividade> dao = new AtividadeDao();
            dao.update(atividade);
        } catch (DataAccessLayerException ex) {
            logger.error(ex.getMessage(), ex);
            throw new SepeException("erro.bo.atividade.alterar", ex);
        }
        //enviarEmail(atividade);
    }

    /**
     * Incluir uma proposição de atividade no sistema.
     * @param atividade A atividade a ser incluído.
     */
    public void addParticipante(Atividade atividade, Participante participante) throws SepeException {
        verificarNull(atividade);
        verificarNull(participante);
        try {
            AtividadeDao dao = new AtividadeDao(getSepe());
            Atividade ativBD = dao.find(atividade.getId());
            if (ativBD.getVagas() == 0) {
                throw new SepeException("erro.bo.atividade.add.participante.vagas");
            }
            ativBD.addParticipante(participante);
            getSepe().closeSessaoHibernate();
            dao.update(ativBD);
        } catch (DataAccessLayerException ex) {
            logger.error(ex.getMessage(), ex);
            throw new SepeException("erro.bo.atividade.add.participante", ex);
        }
        //enviarEmail(atividade);
    }

    /**
     * Incluir uma proposição de atividade no sistema.
     * @param atividade A atividade a ser incluído.
     */
    public void submeter(Atividade atividade) throws SepeException {
        verificarNull(atividade);
        verificarParticipante(atividade);
        try {
            Dao<Atividade> dao = new AtividadeDao();
            atividade.setDataSubmissao(new Date());
            dao.create(atividade);
        } catch (DataAccessLayerException ex) {
            logger.error(ex.getMessage(), ex);
            throw new SepeException("erro.bo.atividade.submeter", ex);
        }
        enviarEmail(atividade);
    }

    private void enviarEmail(Atividade ativ) throws SepeException {
        Email mail = new Email();
        mail.setDestino(ativ.getProponenteEmail());
        mail.setAssunto("[II SEPE CERES/UFRN] Confirmação de Submissão de Atividade");
        mail.setConteudo(msg(ativ));

        MailMessage mailMessage = getMailMessage(mail);
        MailManager m = new MailManager();

        try {
            m.send(mailMessage);
            EmailBO emailBO = new EmailBO(getSepe());
            emailBO.incluir(mail);
        } catch (Exception ex) {
            logger.error("erro.atividade.bo.incluir.email.naoenviado", ex);
            throw new SepeException("erro.atividade.bo.incluir.email.naoenviado");
        }
    }

    private String msg(Atividade ativ) {
        String msg = "Prezado(a) " + ativ.getProponente() + ",\n\n";
        msg += "Os dados de submissão da atividade cadastrada em nossa base de dados s\u00e3o os seguinte: \n";
        msg += "      - E-mail: " + ativ.getProponenteEmail() + "\n";
        msg += "      - Título: " + ativ.getTitulo() + "\n";
        msg += "      - Área: " + ativ.getArea() + "\n";
        msg += "      - Categoria: " + ativ.getCategoria() + "\n";
        msg += "      - Senha: " + ativ.getParticipante().getSenha() + "\n\n";
        msg += "      - Arquivo: " + ativ.getNomeArquivo() + "\n\n";
        msg += "Para mais informa\u00e7\u00f5es sobre a II Semana de Ensino, Pesquisa e Extensão do CERES/UFRN, por favor, \n"
                + "reporte-se ao portal web do evento (" + Constantes.SITE + ").\n\n";
        msg += "Em breve você poderá atualizar seu cadastro e verificar o status de sua atividade!\n\n";
        msg += "Atenciosamente,\n";
        msg += "Comiss\u00e3o Organizadora II SEPE.";
        return msg;
    }

    private void verificarNull(Object obj) throws SepeException {
        if (obj == null) {
            throw new SepeException("erro.bo.atividade.null");
        }
    }

    private void verificarParticipante(Atividade atividade) throws SepeException {
        ParticipanteBO bo = new ParticipanteBO(getSepe());
        Participante participante = bo.buscar(atividade.getProponenteEmail());
        if (participante == null) {
            throw new SepeException("erro.bo.atividade.participante.naocadastrado");
        }
        if (!participante.getSenha().equals(atividade.getParticipante().getSenha())) {
            throw new SepeException("erro.bo.atividade.participante.senha.incorreta");
        }
        atividade.setParticipante(participante);
    }

}
